import java.awt.Color;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Stack;

import javax.swing.JPanel;
import javax.swing.border.LineBorder;

import com.sun.awt.AWTUtilities;

public class Visualizacao extends JPanel implements Runnable {

	ArrayList<Midia> listaEventos = new ArrayList<Midia>();
	static Visualizacao t;

	static int instanteCorrente;

	public static Visualizacao getInstance() {
		if (t == null)
			t = new Visualizacao();
		return  t; 
		
	}

	public void midiasAtivasMomentoCorrente(int a) {

		for (int i = 0; i < listaEventos.size(); i++) {
			if (a >= listaEventos.get(i).getTempoEntrada()
					&& a < (listaEventos.get(i).getTempoEntrada()
							+ listaEventos.get(i).getTempo())) {
				System.out.println(i+" midias sativadas");

				
				if (listaEventos.get(i).getFilhos().size() > 0) {
					listaEventos.get(i).getMidia().setBorder(new LineBorder(new Color(0,0,255)));//.setBackground(new Color(255,255,255,100));
					listaEventos.get(i).getMidia().setVisible(true);
					for (int j = 0; j < listaEventos.get(i).getFilhos().size(); j++) {
					//	listaEventos.get(i).getMidia().setBackground(
							//	new Color(1f, 1f, 1f, 0.5f));
						listaEventos.get(i).getFilhos().get(j).acao();
						listaEventos.get(i).getFilhos().get(j).getMidia().setBorder(new LineBorder(new Color(0,0,255)));//.setBackground(new Color(255,255,255,100));
						listaEventos.get(i).getFilhos().get(j).getMidia().setVisible(true);
						
						//listaEventos.get(i).getFilhos().get(j).getMidia().setBorder(LineBorder.createGrayLineBorder());//.setBackground(new Color(255,255,255,100));
						//listaEventos.get(j).acao();
					}
				}
				
				listaEventos.get(i).acao();
			} else {	
				System.out.println(i+" midias desativadas ");
				listaEventos.get(i).getMidia().setVisible(false);
				
				if (listaEventos.get(i).getFilhos().size() > 0) {
					for (int j = 0; j < listaEventos.get(i).getFilhos().size(); j++) {
					//	listaEventos.get(i).getMidia().setBackground(
							//	new Color(1f, 1f, 1f, 0.5f));
						listaEventos.get(i).getFilhos().get(j).getMidia().setVisible(false);
					
						//listaEventos.get(j).acao();
					}
				}
			}

		}

	}	

	private Visualizacao() {
		setSize(1000, 800);
		setBackground(Color.black);

		// adicao de midias

		Midia v = new Midia(100, 100, 50, 200);
		v.acao(Color.blue);
		v.setTempo(5);
		v.setTempoEntrada(1);

		Midia v2 = new Midia(100, 100, 300, 200);
		v2.acao(Toolkit.getDefaultToolkit().createImage("C:/sergio/tree_of_life_druid.jpg"));
		//v2.acao(Color.blue);
		v2.setPathImage("C:/sergio/tree_of_life_druid.jpg");
		v2.setName("Figura");
		v2.setTempo(2);
		v2.setTempoEntrada(3);

		Midia v3 = new Midia(50, 50, 600, 200);
		v3.acao(Color.red);
		
		Midia v4 = new Midia(200, 50, 50, 500);

		v4.acao("Texto da enquete"); 
		v3.setTempo(6);
		
		v3.setTempoEntrada(3);

		v3.setBotoesAtivacao("vermelho");

		v3.adicionarFilh(v4);
		adicionarNaPilha(v3);
		adicionarNaPilha(v);
		adicionarNaPilha(v2);

		add(v.getMidia());
		add(v2.getMidia());
		add(v3.getMidia());
		add(v4.getMidia());
		// v.getMidia().setVisible(true);

		setLayout(null);

	}

	public void setInstante(int a) {
		instanteCorrente = a;
	}

	public int getInstante() {
		return instanteCorrente;
	}

	public boolean adicionarNaPilha(Midia e) {
		listaEventos.add(e);
		if (listaEventos.size() == 0)
			return true;
		else {
			for (int i = 0; i < listaEventos.size(); i++) {
				for (int j = i + 1; j < listaEventos.size(); j++) {
					if (listaEventos.get(i).getTempoEntrada() > listaEventos
							.get(j).getTempoEntrada()) {
						Midia evt = listaEventos.get(i);
						Midia evt2 = listaEventos.get(j);
						listaEventos.remove(j);
						listaEventos.remove(i);
						listaEventos.add(i, evt2);
						listaEventos.add(j, evt);

					}
				}
			}
			return true;
		}
	}

	/*
	 * public static void main(String[] args) {
	 * 
	 * /* Midia m = new Midia(); m.acao(new Color(0,0,0)); Thread t= new
	 * Thread(m); t.start();
	 * 
	 * try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO
	 * Auto-generated catch block e.printStackTrace(); }
	 * m.ativacaoSemaforo(true);
	 * 
	 * try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO
	 * Auto-generated catch block e.printStackTrace(); } m.liberar();
	 * 
	 * Tela t = new Tela(); Midia v = new Midia(0, 0); v.acao(Color.blue);
	 * v.setNome("midia1"); v.setTempo(3); v.setTempoEntrada(3);
	 * 
	 * Midia v2 = new Midia(0, 0); v2.acao(Color.blue); v2.setNome("midia2");
	 * v2.setTempo(3); v2.setTempoEntrada(5);
	 * 
	 * Midia v3 = new Midia(0, 0); v3.acao(Color.blue); v3.setTempo(3);
	 * v3.setNome("midia3"); v3.setTempoEntrada(2);
	 * 
	 * Midia v4 = new Midia(0, 0); v4.acao(Color.blue); v4.setTempo(3);
	 * v4.setNome("midia4"); v4.setTempoEntrada(6);
	 * 
	 * t.adicionarNaPilha(v);
	 * 
	 * System.out.println(); t.adicionarNaPilha(v2);
	 * 
	 * System.out.println(); t.adicionarNaPilha(v3);
	 * 
	 * System.out.println(); t.adicionarNaPilha(v4);
	 * 
	 * System.out.println(t.listaEventos.size()); int tam =
	 * t.listaEventos.size(); for (int i = 0; i < tam; i++) {
	 * System.out.print(t.listaEventos.get(i).getTempoEntrada() + " " + i);
	 * System.out.println(t.listaEventos.get(i).getNome());
	 * 
	 * } }
	 */

	public int getTempoCorrenteSimulacao() {
		return instanteCorrente;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			int tamanho = this.listaEventos.size();
			for (int i = 0; i < tamanho; i++) {
				if (instanteCorrente == listaEventos.get(i).getTempoEntrada()) {

					Midia m = listaEventos.get(i);
					if (!m.isAlive() && m.temFilhos() == false) {
						m.start();
					} else {// eventos nao deterministicos
						if (!m.isAlive()
								&& m.temFilhos() == true
								&& !m
										.esseBotaoAtivaAMidia(Controle.botaoPressionado)) {
							m.start();
						}
						if(m.isAlive()
								&& m.temFilhos() == true
								&& m
										.esseBotaoAtivaAMidia(Controle.botaoPressionado)){
							System.out.println("startei filhos");
						
							for (int j = 0; j < m.getFilhos().size(); j++) {
								if(!m.getFilhos().get(j).isAlive())
								m.getFilhos().get(j).start();
							}
							System.out.println("teste");
							m.pararMidia();
						}
							
						}
					
				
					// System.out.println(m.getName() + " rodando");

				}
				if (instanteCorrente >= listaEventos.get(i).getTempoEntrada()
						+ listaEventos.get(i).getTempo()) {
					Midia m = listaEventos.get(i);
					m.pararMidia();
				}
				
				if (listaEventos.get(i).isAlive()
						&& listaEventos.get(i).temFilhos() == true
						&& listaEventos.get(i)
								.esseBotaoAtivaAMidia(Controle.botaoPressionado)) {
					System.out.println("startei filhos");
					for (int j = 0; j < listaEventos.get(i).getFilhos().size(); j++) {
						if(!(listaEventos.get(i).getFilhos().get(j).isAlive()))
								listaEventos.get(i).getFilhos().get(j).start();
					}
				
				}

			}

		}
	}

}
